package nmp.gui;

import java.util.LinkedHashMap;
import java.util.Map;

import nmp.remote.R;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;

public class CGroupListAdapter extends BaseAdapter {
	
	protected final Map<String, Adapter> header_adpter_map = new LinkedHashMap<String, Adapter>();	
	protected final ArrayAdapter<String> header_array_adpter;
	protected final static int TYPE_SECTION_HEADER = 0;

	public CGroupListAdapter(Context context) {
		header_array_adpter = new ArrayAdapter<String>(context,R.layout.list_header);
	}

	public void addSection(String section_str, Adapter adapter) {
		this.header_array_adpter.add(section_str);
		this.header_adpter_map.put(section_str, adapter);
    }

	public Object getItem(int position) {
		for (Object key : this.header_adpter_map.keySet()) {
				Adapter adapter = header_adpter_map.get(key);
				int size = adapter.getCount() + 1;

				// check if position inside this section
				if (position == 0) 
					return key;
				if (position < size) 
					return adapter.getItem(position - 1);

				// otherwise jump into next section
				position -= size;
		}
		return null;
    }

	public int getCount() {
		// total together all sections, plus one for each section header
		int total = 0;
		for (Adapter adapter : this.header_adpter_map.values())
			total += adapter.getCount() + 1;
		return total;
    }

	@Override
	public int getViewTypeCount() {
		// assume that headers count as one, then total all sections
		int total = 1;
		for (Adapter adapter : this.header_adpter_map.values())
			total += adapter.getViewTypeCount();
		return total;
    }

	@Override
	public int getItemViewType(int position) {
		int type = 1;
		for (Object key : this.header_adpter_map.keySet()) {
					Adapter adapter = header_adpter_map.get(key);
				int size = adapter.getCount() + 1;

				// check if position inside this section
				if (position == 0) 
					return TYPE_SECTION_HEADER;
				if (position < size) 
					return type + adapter.getItemViewType(position - 1);

				// otherwise jump into next section
				position -= size;
				type += adapter.getViewTypeCount();
		}
		return -1;
    }

	public boolean areAllItemsSelectable() {
		return false;
    }

	@Override
	public boolean isEnabled(int position) {
		return (getItemViewType(position) != TYPE_SECTION_HEADER);
	}

	public View getView(int position, View convertView, ViewGroup parent) {
			int sectionnum = 0;
			for (Object section : this.header_adpter_map.keySet()) {
					Adapter adapter = header_adpter_map.get(section);
					int size = adapter.getCount() + 1;

					// check if position inside this section
					if (position == 0) 
						return header_array_adpter.getView(sectionnum, convertView, parent);
					
					if (position < size) 
						return adapter.getView(position - 1, convertView, parent);

					// otherwise jump into next section
					position -= size;
					sectionnum++;
			}
			return null;
		}

	public long getItemId(int position) {
		return position;
    }
}
